using UnityEngine;
using System.Collections;
using System;

namespace CFE
{
public class Units : Base { 
        private float As; // Attack Speed (константа)
		private float attack_timer;// текущее значение таймера атаки
        private int Ms; // MovementSpeed
        private int Range; // Дальность атаки
        private int Dmg1, Dmg2; // Два показателя силы атаки : наименьший и наибольший
        private int See; // Радиус видимости
		public bool InFight;//характеризует состояние юнита
		
		//Инициализация объекта
		public void initialize(string _Race,int unit_type)
		{
			int _MaxHP=0,_Arm=0;
			Race race;
			//Идентификация рассы и класса, задание характеристик
			race=(Race)Enum.Parse(typeof(Race),_Race);
			
			if(race.Equals(Race.Humans))//Люди
			{
				switch(unit_type)
				{
				case 1://Крестьянин
					_MaxHP=200;
					_Arm=1;
					As=2;
					Ms=100;
					Range=5;
					Dmg1=15;
					Dmg2=20;
					gameObject.name="Peasant";
					break;
				case 2://Адепт
					_MaxHP=250;
					_Arm=1;
					As=1;
					Ms=150;
					Range=65;
					Dmg1=30;
					Dmg2=35;
					gameObject.name="Adept";
					break;
				case 3://Маг
					_MaxHP=375;
					_Arm=2;
					As=0.7f;
					Ms=150;
					Range=65;
					Dmg1=70;
					Dmg2=75;
					gameObject.name="Caster";
					break;
				case 4://Мечник
					_MaxHP=350;
					_Arm=4;
					As=1.6f;
					Ms=100;
					Range=5;
					Dmg1=25;
					Dmg2=30;
					gameObject.name="Sworder";
					break;
				case 5://Капитан
					_MaxHP=550;
					_Arm=5;
					As=1;
					Ms=100;
					Range=5;
					Dmg1=60;
					Dmg2=65;
					gameObject.name="Capitan";
					break;
				case 6://Рыцарь
					_MaxHP=850;
					_Arm=7;
					As=0.7f;
					Ms=200;
					Range=10;
					Dmg1=40;
					Dmg2=45;
					gameObject.name="Knight";
					break;					
				}
			}
			else if(race.Equals(Race.Orks))//Орки
			{
				switch(unit_type)
				{
				case 1://Всадник
					_MaxHP=500;
					_Arm=2;
					As=1.6f;
					Ms=150;
					Range=10;
					Dmg1=20;
					Dmg2=25;
					gameObject.name="Rider";
					break;
				case 2://Троль
					_MaxHP=350;
					_Arm=2;
					As=1;
					Ms=50;
					Range=5;
					Dmg1=35;
					Dmg2=45;
					gameObject.name="Troll";
					break;
				case 3://Большой троль
					_MaxHP=550;
					_Arm=3;
					As=0.7f;
					Ms=100;
					Range=5;
					Dmg1=70;
					Dmg2=80;
					gameObject.name="Big Troll";
					break;
				case 4://Орк
					_MaxHP=550;
					_Arm=5;
					As=2;
					Ms=100;
					Range=5;
					Dmg1=20;
					Dmg2=25;
					gameObject.name="Ork";
					break;
				case 5://Метатель топоров
					_MaxHP=750;
					_Arm=3;
					As=1;
					Ms=100;
					Range=55;
					Dmg1=40;
					Dmg2=45;
					gameObject.name="Axe Thrower";
					break;
				case 6://Шаман
					_MaxHP=650;
					_Arm=2;
					As=0.7f;
					Ms=150;
					Range=5;
					Dmg1=65;
					Dmg2=70;
					gameObject.name="Shaman";
					break;
				}
			}
			else if(race.Equals(Race.Elfs))//Эльфы
			{
				switch(unit_type)
				{
				case 1://Энт
					_MaxHP=1050;
					_Arm=5;
					As=2;
					Ms=50;
					Range=5;
					Dmg1=15;
					Dmg2=25;
					gameObject.name="Ent";
					break;
				case 2://Тигр
					_MaxHP=450;
					_Arm=5;
					As=1;
					Ms=150;
					Range=5;
					Dmg1=30;
					Dmg2=35;
					gameObject.name="Tiger";
					break;
				case 3://Свирепый тигр
					_MaxHP=550;
					_Arm=7;
					As=1;
					Ms=150;
					Range=5;
					Dmg1=40;
					Dmg2=45;
					gameObject.name="Furious Tiger";
					break;
				case 4://Лучник
					_MaxHP=200;
					_Arm=1;
					As=0.7f;
					Ms=100;
					Range=65;
					Dmg1=20;
					Dmg2=25;
					gameObject.name="Archer";
					break;
				case 5://Меткий луник
					_MaxHP=500;
					_Arm=2;
					As=0.7f;
					Ms=100;
					Range=65;
					Dmg1=45;
					Dmg2=50;
					gameObject.name="Accurate Archer";
					break;
				case 6://Мощный лучник
					_MaxHP=750;
					_Arm=2;
					As=0.7f;
					Ms=100;
					Range=65;
					Dmg1=60;
					Dmg2=75;
					gameObject.name="Strong Archer";
					break;
				}
			}
			//Инициализация полей
			Base temp_base=gameObject.GetComponent<Base>();
			temp_base.initialize(_MaxHP,_Arm);
			Pos=transform;
			attack_timer=0;
			See=70;
			Range*=Range;//Возводим в квадрат, т.к. все сравнения производятся с квадратом расстояния
			See*=See;//Возводим в квадрат, т.к. все сравнения производятся с квадратом расстояния
			
		}
		//Движение
        public void Move(Vector3 _target)
        {
			float move_x=Mathf.Sqrt((Ms*0.0001f*Mathf.Abs(_target.x-Pos.position.x))/Mathf.Abs((Pos.position.x-_target.x)+(Pos.position.y-_target.y)));
			if(Pos.position.x>_target.x) move_x=move_x*(-1);
			float move_y=Mathf.Sqrt((Ms*0.0001f*Mathf.Abs(_target.y-Pos.position.y))/Mathf.Abs((Pos.position.x-_target.x)+(Pos.position.y-_target.y)));
			if(Pos.position.y>_target.y) move_y=move_y*(-1);
			Pos.Translate(move_x,move_y,0.0f,Space.World);
        }

		//Определение вхождения цели в радиус атаки
		protected bool InRadiusAttack(Vector3 _enemy)
		{
			return((Pos.position - _enemy).sqrMagnitude<Range);		
		}
		//Определение вхождения цели в радиус видимости
		public bool InRadiusSee(Vector3 _enemy)
		{
			return ((Pos.position - _enemy).sqrMagnitude<See);
		}
		//Атака
        public void Attack(Base enemy)
        {			
			if(!InRadiusAttack(enemy.Pos.position))
			{				
				Move(enemy.Pos.position);
			}
			else if(enemy!=null)
			{
					if(attack_timer>0) attack_timer-=Time.deltaTime;
					if(attack_timer<0) attack_timer=0;
					if(attack_timer==0)
					{
	            		enemy.LoseHp(Convert.ToInt32(UnityEngine.Random.Range(Dmg1, Dmg2)));
						attack_timer=As;
					}
			}
			
        }
	
}
}